package com.zy.design.ocp;

import com.zy.design.ocp.base.Notification;
import com.zy.design.ocp.ns.*;

/**
 * @author zhaoyi
 * @date 2021/3/15 17:39
 *
 * 开闭原则
 *    对扩展开放、修改关闭
 *
 * 第一处改动是：在 ApiStatInfo 类中添加新的属性 timeoutCount。
 * 第二处改动是：添加新的 TimeoutAlertHander 类
 * 第三处改动是：在 ApplicationContext 类的 initializeBeans() 方法中，往 alert 对象中注册新的 timeoutAlertHandler
 * 第四处改动是：在使用 Alert 类的时候，需要给 check() 函数的入参 apiStatInfo 对象设置 timeoutCount 的值
 *
 * 我们回到这条原则的设计初衷：只要它没有破坏原有的代码的正常运行，没有破坏原有的单元测试，我们就可以说，这是一个合格的代码改动
 */
public class ApplicationContext {

    private AlertRule2 alertRule;
    private Notification notification;
    private Alert2 alert;


    private void initializeBeans() {
        alertRule = new AlertRule2(/*. 省略参数.*/); // 省略一些初始化代码
        notification = new Notification(/*. 省略参数.*/); // 省略一些初始化代码
        alert = new Alert2();
        alert.addAlertHandler(new TpsAlertHandler(alertRule, notification));
        alert.addAlertHandler(new ErrorAlertHandler(alertRule, notification));
        // 改动：注册 handler
        alertRule.setMaxTimeoutTps(10);
        alert.addAlertHandler(new TimeoutAlertHandler(alertRule, notification));
    }

    // 饿汉式单例
    private static final ApplicationContext instance = new ApplicationContext();

    private ApplicationContext() {
        initializeBeans();
    }

    public static ApplicationContext getInstance(){
        return instance;
    }

    public Alert2 getAlert() {
        return alert;
    }
}

